/*
 * Copyright 2015-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.dcp.jeedcp.common.persistence.interceptor;

import java.io.Serializable;
import java.util.Properties;

import com.dcp.jeedcp.common.config.Global;
import com.dcp.jeedcp.common.persistence.Page;
import com.dcp.jeedcp.common.persistence.dialect.Dialect;
import com.dcp.jeedcp.common.persistence.dialect.db.DB2Dialect;
import com.dcp.jeedcp.common.persistence.dialect.db.DerbyDialect;
import com.dcp.jeedcp.common.persistence.dialect.db.H2Dialect;
import com.dcp.jeedcp.common.persistence.dialect.db.HSQLDialect;
import com.dcp.jeedcp.common.persistence.dialect.db.MySQLDialect;
import com.dcp.jeedcp.common.persistence.dialect.db.OracleDialect;
import com.dcp.jeedcp.common.persistence.dialect.db.PostgreSQLDialect;
import com.dcp.jeedcp.common.persistence.dialect.db.SQLServer2005Dialect;
import com.dcp.jeedcp.common.persistence.dialect.db.SybaseDialect;
import com.dcp.jeedcp.common.utils.Reflections;

import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
import org.apache.ibatis.plugin.Interceptor;

/**
 * Mybatis分页拦截器基类
 *
 * @author poplar.yfyang / jeeplus
 * @version 2013-8-28
 */
public abstract class BaseInterceptor implements Interceptor, Serializable {

	private static final long serialVersionUID = 1L;

	protected static final String PAGE = "page";

	protected static final String DELEGATE = "delegate";

	protected static final String MAPPED_STATEMENT = "mappedStatement";

	protected Log log = LogFactory.getLog(this.getClass());

	protected Dialect DIALECT;

	//    /**
	//     * 拦截的ID，在mapper中的id，可以匹配正则
	//     */
	//    protected String _SQL_PATTERN = "";

	/**
	 * 对参数进行转换和检查
	 *
	 * @param parameterObject 参数对象
	 * @param page            分页对象
	 * @return 分页对象
	 * @throws NoSuchFieldException 无法找到参数
	 */
	@SuppressWarnings("unchecked")
	protected static Page<Object> convertParameter(Object parameterObject, Page<Object> page) {
		try {
			if (parameterObject instanceof Page) {
				return (Page<Object>) parameterObject;
			} else {
				return (Page<Object>) Reflections.getFieldValue(parameterObject, PAGE);
			}
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 设置属性，支持自定义方言类和制定数据库的方式
	 * <code>dialectClass</code>,自定义方言类。可以不配置这项
	 * <ode>dbms</ode> 数据库类型，插件支持的数据库
	 * <code>sqlPattern</code> 需要拦截的SQL ID
	 *
	 * @param p 属性
	 */
	protected void initProperties(Properties p) {
		Dialect dialect = null;
		String dbType = Global.getConfig("jdbc.type");
		if ("db2".equals(dbType)) {
			dialect = new DB2Dialect();
		} else if ("derby".equals(dbType)) {
			dialect = new DerbyDialect();
		} else if ("h2".equals(dbType)) {
			dialect = new H2Dialect();
		} else if ("hsql".equals(dbType)) {
			dialect = new HSQLDialect();
		} else if ("mysql".equals(dbType)) {
			dialect = new MySQLDialect();
		} else if ("oracle".equals(dbType)) {
			dialect = new OracleDialect();
		} else if ("postgre".equals(dbType)) {
			dialect = new PostgreSQLDialect();
		} else if ("mssql".equals(dbType) || "sqlserver".equals(dbType)) {
			dialect = new SQLServer2005Dialect();
		} else if ("sybase".equals(dbType)) {
			dialect = new SybaseDialect();
		}
		if (dialect == null) {
			throw new RuntimeException("mybatis dialect error.");
		}
		DIALECT = dialect;
		//        _SQL_PATTERN = p.getProperty("sqlPattern");
		//        _SQL_PATTERN = Global.getConfig("mybatis.pagePattern");
		//        if (StringUtils.isEmpty(_SQL_PATTERN)) {
		//            throw new RuntimeException("sqlPattern property is not found!");
		//        }
	}
}
